import os  # 用于访问环境变量和操作系统功能

from langchain_core.messages import HumanMessage
from langchain_openai import ChatOpenAI  # 用于调用OpenAI兼容接口的模型（适配阿里云百炼）
from langchain_tavily import TavilySearch
from langgraph.prebuilt import chat_agent_executor
from pydantic import SecretStr  # 用于安全存储和传递API密钥（避免明文暴露）

os.environ["TAVILY_API_KEY"] = "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"

api_key = os.getenv("DASHSCOPE_API_KEY")
# 检查API密钥是否存在，若不存在则抛出错误提示
if not api_key:
    raise ValueError("请设置环境变量DASHSCOPE_API_KEY（阿里云百炼API-KEY）")
# 1. 创建大语言模型实例（适配阿里云百炼的DeepSeek模型）
model = ChatOpenAI(
    model="qwen-plus-latest",  # 模型名称，需与阿里云百炼平台支持的模型名一致
    temperature=0,  # 生成内容的随机性（0表示确定性输出，1表示最大随机性）
    max_tokens=None,  # 最大生成 tokens 数（None表示使用模型默认值）
    timeout=None,  # 超时时间（None表示无超时限制）
    max_retries=2,  # 调用失败时的最大重试次数
    api_key=SecretStr(api_key),  # 以安全字符串形式传递API密钥
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",  # 阿里云百炼的OpenAI兼容接口地址
)

# LangChain内置了一个工具，可以轻松的使用Tavily搜索引擎作为搜索工具
tavilySearch = TavilySearch(max_results=2)  # max_results:只返回两个结果
# print(tavilySearch.invoke('今天广东天气怎么样?'))

# 给模型绑定工具
tools = [tavilySearch]
# model_with_tools = model.bind_tools(tools)
#
# res1 = model_with_tools.invoke([HumanMessage(content='广东省会是哪里?')])
#
# print(f'Model_Result_Content: {res1.content}')
# print(f'Tools_Result_Content: {res1.tool_calls}')
#
# res2 = model_with_tools.invoke([HumanMessage(content='今天广东天气怎么样?')])
#
# print(f'Model_Result_Content: {res2.content}')
# print(f'Tools_Result_Content: {res2.tool_calls}')

# 构建代理
agent_executor = chat_agent_executor.create_tool_calling_executor(model, tools)

result1 = agent_executor.invoke({'messages': [HumanMessage(content='广东省会是哪里?')]})
print(result1['messages'])

result2 = agent_executor.invoke({'messages': [HumanMessage(content='今天广东天气怎么样?')]})
print(result2['messages'])
